package com.infore.statisticsAndAlarm.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.multipart.MultipartFile;

import sun.misc.BASE64Decoder;

/**
 * 文件工具类
 *
 * @author zw
 * @Description: 目前没有添加虚拟目录，文件存在upload中
 */
public class FileUtil {
    /**
     * @param inputFile
     * @param fileDir   父目录
     * @return
     * @description 保存上传的文件
     * @date 2017年8月26日上午10:35:00
     * @author 张伟
     */
    public static int saveFileByTT(MultipartFile inputFile, String fileName, String fileDir) {
        int flag = 0;
        File targetFile = new File(fileDir, fileName);
        if (!targetFile.exists()) {
            targetFile.mkdirs();
        }
        // 保存
        try {
            inputFile.transferTo(targetFile);
        } catch (Exception e) {
            flag = 0;
            e.printStackTrace();
        }
        return flag;
    }
    
    //base64字符串转化成文件 
    public static String GenerateFile(String str,String url,String fileName) {   //对字节数组字符串进行Base64解码并生成图片  
    	//图像数据为空  
    	if (str == null) 
            return "error";  
        BASE64Decoder decoder = new BASE64Decoder();
        try{  
            //Base64解码  
        	byte[] b = decoder.decodeBuffer(str);  
            for(int i=0;i<b.length;++i) {  
            	//调整异常数据  
                if(b[i]<0){
                    b[i]+=256;  
                }  
            }  
            //生成jpeg图片  
            String imgFilePath = url+fileName;//新生成的图片  
            OutputStream out = new FileOutputStream(imgFilePath);      
            out.write(b);  
            out.flush();  
            out.close();  
            return imgFilePath;  
        }   
        catch (Exception e){
        	e.printStackTrace();
            return "error";  
        }  
    }  

    /**
     * @param inputFile
     * @param path      文件物理路径
     * @return
     * @description 保存上传的文件
     * @date 2017年8月26日上午10:35:00
     * @author 张伟
     */
    public static int saveFileByOS(MultipartFile inputFile, String path) {
        int flag = 0;
        try {
            File targetDir = new File(path);
            if (!targetDir.exists()) {
                targetDir.mkdirs();
            }
            // 获取输出流
            OutputStream os = new FileOutputStream(path);
            // 获取输入流 CommonsMultipartFile 中可以直接得到文件的流
            InputStream is = inputFile.getInputStream();
            byte[] buf = new byte[1024 * 30];
            int length = 0;
            while ((length = is.read(buf)) != -1) {
                os.write(buf, 0, length);
            }
            os.flush();
            os.close();
            is.close();
        } catch (Exception e) {
            flag = 0;
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * @Title: fileDownload
     * @Description: 文件下载
     * @date 2017年8月26日下午10:35:00
     * @author 张伟
     */
    public static void fileDownload(HttpServletRequest request,
                                    HttpServletResponse response) {
        //客户端取消下载，会抛出一个异常ClientAbortException
        String fileName = request.getParameter("fileName");
        //该项目tomcat中已经修改了默认编码为utf-8，故而不需要转换格式
//		try {
//			fileName=new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
//		} catch (UnsupportedEncodingException e1) {
//			e1.printStackTrace();
//		}
        if (fileName != null) {
            String path = request.getSession().getServletContext().getRealPath("upload");
            File file = new File(path, fileName);
            if (file.exists()) {
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                OutputStream os = null;
                response.setCharacterEncoding("utf-8");
                // 设置强制下载不打开
                response.setContentType("application/force-download");
                try {
                    //必须要将返回的参数，转换编码格式，header中只支持ASCII，
                    //所以我们传输的文件名必须是ASCII，当文件名为中文时，必须要将该中文转换成ASCII
                    response.addHeader("Content-Disposition",
                            "attachment;fileName=" + new String(fileName.getBytes(), "ISO-8859-1"));
                    byte[] buffer = new byte[1024];
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    os = response.getOutputStream();
                    int i = bis.read(buffer);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (os != null) {
                            os.close();
                        }
                        if (bis != null) {
                            bis.close();
                        }
                        if (fis != null) {
                            fis.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static void fileDownloadByByeteArray(HttpServletResponse response,String fileName, byte[] bytes) {
        //客户端取消下载，会抛出一个异常ClientAbortException
        OutputStream toClient = null;
        response.setCharacterEncoding("utf-8");
        // 清空response
        response.reset();
        // 设置强制下载不打开
        response.setContentType("application/force-download");
        try {
            //必须要将返回的参数，转换编码格式，header中只支持ASCII，
            //所以我们传输的文件名必须是ASCII，当文件名为中文时，必须要将该中文转换成ASCII
            response.addHeader("Content-Disposition",
                    "attachment;fileName=" + new String(fileName.getBytes(), "ISO-8859-1"));
            toClient = new BufferedOutputStream(
                    response.getOutputStream());
            toClient.write(bytes);
            toClient.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (toClient != null) {
                    toClient.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @Title: fileDelete
     * @Description: 文件删除
     * @date 2017年8月28日下午15:23:00
     * @author 张伟
     */
    public static int fileDelete(String path) {
        int flag = -1;
        try {
            File file = new File(path);
            // 路径为文件且不为空则进行删除
            if (file.isFile() && file.exists()) {
                file.delete();
            }
            flag = 0;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 创建目录
     *
     * @param filepath
     * @return
     * @throws Exception
     */
    public static boolean createDir(String filepath) {
        File file = new File(filepath);
        //判断文件目录的存在
        if (!file.exists()) {
            //判断文件的存在性
            return file.mkdirs();
        }
        return false;
    }

    /**
     * 创建文件
     *
     * @param filepath
     * @return
     * @throws Exception
     */
    public static File createFile(String filepath) {
        File file = new File(filepath);
        //判断文件目录的存在
        if (!file.exists()) {
            //判断文件的存在性
            if (file.isFile()) {
                try {
                    file.createNewFile();
                    return file;
                } catch (IOException e) {
                    e.printStackTrace();
                    return null;
                }
            }
        }
        return null;
    }

}
